package com.hr.runnerbuddy;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.location.Criteria;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.SystemClock;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.Chronometer.OnChronometerTickListener;
import android.widget.TextView;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;
import com.hr.runnerbuddy.database.DBAdapter;
import com.hr.runnerbuddy.database.ParcourPunt;

public class ParcourMap extends MapActivity implements OnInitListener,
		OnSharedPreferenceChangeListener {
	/** Called when the activity is first created. */

	private MapController mapController;
	private LocationManager lm;
	public LocationListener locationListener;
	public int mintime_save;
	public int mindistance_save;
	public boolean todb_save;
	private static final String PREFS_NAME = "savesettings";
	private SharedPreferences settings;
	private PowerManager.WakeLock wl;
	private GPSListener gpsListener;
	private DBAdapter dbHelper;
	private Maperror maperror;
	private Dialog dialog;
	protected Cursor cursor = null;
	private MapView mapView;
	private double latitude1 = 4.346492886543274;
	private double longitude1 = 51.826152205467224;
	private double latitude2;
	private double longitude2;
	private double latitude_last;
	private double longitude_last;

	private List<ParcourPunt> parcourPunten = new ArrayList<ParcourPunt>();
	private Projection projection;
	private double[] huidigelocatie;
	private Button pauzeknopMain;
	private Button stopknopMain;
	private Button pauzeknoppauze;
	private boolean pauzestatus = true;
	private int parcourId = 0;
	private int loopsessieId = 0;
	private double parcourlengte;
	private String parcournaam;
	private String parcourkeuzegemsnelheid;
	private String parcourkeuzemaxlooptijd;
	private TextView mapsparcournaam;
	private TextView mapsafgelegdeafstand;
	private TextView mapsverstrekentijd;
	private TextView mapshuidigesnelheid;
	private int beginpuntId;
	private int mapsize;
	private final int Clock_LENGHT = 1000;
	private TextToSpeech mTts;
	private int MY_DATA_CHECK_CODE = 1234;
	private String myText1 = "";
	private String myText2 = "";
	private List<Overlay> mapOverlaysList;
	private final int UPDATE_TIME = 1000;
	private long timeWhenStopped;
	private Chronometer stopWatch;

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Log.d("HELP", "context " + getApplicationContext());
		dbHelper = new DBAdapter(getApplicationContext());
		dbHelper.open();

		PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
		wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNotDimScreen");

		maperror = new Maperror(this);

        Bundle extras = getIntent().getExtras();

		if (extras != null) {
			parcourlengte = extras.getDouble("parcourlengte");
			parcourkeuzegemsnelheid = extras
					.getString("parcourkeuzegemsnelheid");
			parcourkeuzemaxlooptijd = extras
					.getString("parcourkeuzemaxlooptijd");
			parcournaam = extras.getString("parcournaam");
			parcourlengte = extras.getDouble("parcourlengte");
			// Toast.makeText(getApplicationContext(),
			// parcourlengte+" / "+parcourkeuzegemsnelheid+" / "+parcourkeuzemaxlooptijd,
			// Toast.LENGTH_SHORT).show();
			// textViewParcourlengte.setText("Parcourlengte: "+extras.getString("parcourlengte")+" m");
		}

		mapsparcournaam = (TextView) findViewById(R.id.mapsparcournaam);
		mapsparcournaam.setText(parcournaam);

		mapsafgelegdeafstand = (TextView) findViewById(R.id.mapsafgelegdeafstand);
		mapsafgelegdeafstand.setText("0/" + parcourlengte + " m");

		mapsverstrekentijd = (TextView) findViewById(R.id.mapsverstrekentijd);
		mapsverstrekentijd.setText("00:00:00");

		mapshuidigesnelheid = (TextView) findViewById(R.id.mapshuidigesnelheid);
		mapshuidigesnelheid.setText("0 km/u");

		settings = getSharedPreferences(PREFS_NAME, 0);
		mintime_save = settings.getInt("mintime", 10);
		mindistance_save = settings.getInt("mindistance", 20);
		todb_save = settings.getBoolean("savetodb", false);

		Criteria criteria = new Criteria();
		criteria.setAccuracy(Criteria.ACCURACY_FINE);
		criteria.setAltitudeRequired(false);
		criteria.setBearingRequired(false);
		criteria.setCostAllowed(true);
		criteria.setPowerRequirement(Criteria.ACCURACY_FINE);
		
		stopWatch = (Chronometer) findViewById(R.id.mapsverstrekentijd);
		
		/*
		 * Nog te doen: timer netjes op pauze zetten en de tijd niet laten verschieten alsof de pauze niet heeft gewerkt.
		 */
		
        stopWatch.setOnChronometerTickListener(new OnChronometerTickListener(){
            @Override
            public void onChronometerTick(Chronometer arg0) {
                long countUp = (SystemClock.elapsedRealtime() - arg0.getBase()) / 1000;
                
                int h = (int) countUp / 3600;
                int m = (int) (countUp % 3600) / 60;
                int s = (int) countUp % 60;
                
                String asText = formatChronometerDigits(h) + ":" + formatChronometerDigits(m) + ":" + formatChronometerDigits(s); 
                mapsverstrekentijd.setText(asText);
            }
        });
        
		createPauzeDialog();

		lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		Log.d("whoops", "voor location");
//		if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
			if (lm.getBestProvider(criteria, true) != null) {
				Log.d("whoops", "in location");
				String provider = lm.getBestProvider(criteria, true);
				locationListener = new MyLocationListener();
				lm.requestLocationUpdates(provider, mintime_save * 1000,
						mindistance_save, locationListener);
			}
//		} else {
//			maperror.showMapError();
//			maperror.setText("Er is geen verbinding met de GPS-satelliet.");
//		}//

		// lm.requestLocationUpdates(provider, 1000L, 10.0f, this);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		mapView = (MapView) findViewById(R.id.mapview);
		mapView.setSatellite(true);
		mapView.setBuiltInZoomControls(true);
		mapView.displayZoomControls(true);

		mapController = mapView.getController();
		if (mapView.getZoomLevel() < 20) {
			mapController.setZoom(20);
		}

		gpsListener = new GPSListener();
		lm.addGpsStatusListener(gpsListener);

		pauzeknopMain = (Button) findViewById(R.id.pauzeknopmain);
		pauzeknopMain.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				// Perform action on click.
				// Restore preferences
				pauzeknopMain.setEnabled(false);
				mapView.setBuiltInZoomControls(false);
				pauzestatus = true;
				createPauzeDialog();
			}
		});

		stopknopMain = (Button) findViewById(R.id.stopknopmain);
		stopknopMain.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				// Perform action on click.
				getStopButtonDialog();
//				Intent intent = new Intent(ParcourMap.this, Hoofdmenu.class);
//				startActivity(intent);
			}
		});
	}
	
	public String formatChronometerDigits(int digit){
		String foramtteddigit = "";
		if(digit < 10){
			foramtteddigit = "0"+Integer.toString(digit);
		}
		else{
			foramtteddigit = Integer.toString(digit);
		}
		
		return foramtteddigit;
	}

	@Override
	protected void onResume() {
		super.onResume();
		wl.acquire();

		if (parcourPunten.size() == 0) {
			mapOverlaysList = mapView.getOverlays();

			projection = mapView.getProjection();

			Drawable drawable = this.getResources().getDrawable(
					R.drawable.maprouteitem);
			KaartObjectLaag itemizedOverlay = new KaartObjectLaag(drawable,
					this);

			listGPSItems();
			Log.w("whoops", "GPS objecten");

			for (int i = 0; i < parcourPunten.size(); i++) {

				latitude1 = parcourPunten.get(i).getLatitude();
				longitude1 = parcourPunten.get(i).getLongitude();

				Log.w("whoops", "i: " + Integer.toString(i));

				GeoPoint punt1 = new GeoPoint((int) (latitude1 * 1e6),
						(int) (longitude1 * 1e6));

				mapController.setCenter(punt1);

				OverlayItem overlayitem = new OverlayItem(punt1, "Info",
						"punt " + (i + 1));

				if (longitude2 != 0 && latitude2 != 0) {
					GeoPoint punt2 = new GeoPoint((int) (latitude2 * 1e6),
							(int) (longitude2 * 1e6));
					Log.w("whoops", "l: " + Double.toString(latitude2));
					// Pass the geopoints to the overlay class
					MapOverlayLines mapOvlay = new MapOverlayLines(punt1, punt2);
					mapView.getOverlays().add(mapOvlay);
					Log.w("whoops", "geen lon lat 2");
				}

				itemizedOverlay.addOverlay(overlayitem);
				mapOverlaysList.add(itemizedOverlay);

				mapsize = (int) mapOverlaysList.size();

				Log.w("whoops",
						"_____________________________________________________");

				longitude2 = longitude1;
				latitude2 = latitude1;

				if (longitude_last == 0 && latitude_last == 0) {

					longitude_last = parcourPunten
							.get(parcourPunten.size() - 1).getLongitude();

					ParcourPunt eindpunt = new ParcourPunt(parcourId,
							longitude_last, latitude_last);

					double[] beginpunt = new double[2];
					beginpunt[0] = (double) punt1.getLongitudeE6() / 1e6;
					beginpunt[1] = (double) punt1.getLatitudeE6() / 1e6;

					if (OpRoute.getPuntenAfstand(beginpunt, eindpunt) < 25) {
						GeoPoint point_last = new GeoPoint(
								(int) (latitude_last * 1e6),
								(int) (longitude_last * 1e6));

						MapOverlayLines mapOvlay2 = new MapOverlayLines(
								point_last, punt1);
						mapView.getOverlays().add(mapOvlay2);

						longitude_last = longitude1;
						latitude_last = latitude1;
					} else {
						Log.w("whoops",
								"afstand: "
										+ OpRoute.getPuntenAfstand(beginpunt,
												eindpunt));
					}
				}

			}
			Log.w("whoops", "Overlay items: " + mapOverlaysList.size());
		}
	}

	private void createPauzeDialog() {
		dialog = new Dialog(ParcourMap.this);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.setContentView(R.layout.pauzeknop);
		dialog.setTitle("Pauze");
		dialog.setCancelable(false);
		dialog.show();
		getPauzeButtonDialog();
		stopWatch.stop();
		timeWhenStopped = SystemClock.elapsedRealtime();
	}

	private void getPauzeButtonDialog() {
		pauzeknoppauze = (Button) dialog.findViewById(R.id.pauzeknopbutton);
		pauzeknoppauze.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				// Toast.makeText(_context, "test", Toast.LENGTH_SHORT).show();
				// Perform action on click
				// Restore preferences
				pauzeknopMain.setEnabled(true);
				pauzestatus = false;
				dialog.dismiss();
				mapView.setClickable(true);
				mapView.setBuiltInZoomControls(true);
				stopWatch.setBase(stopWatch.getBase() + (SystemClock.elapsedRealtime() - timeWhenStopped));
				stopWatch.start();
			}
		});
	}
	
	private void getStopButtonDialog() {
		final Dialog stopDialog = new Dialog(ParcourMap.this);
		stopDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		stopDialog.setContentView(R.layout.parcourdialog);
		stopDialog.setCancelable(false);
		stopDialog.show();
		TextView textView = (TextView) stopDialog.findViewById(R.id.text1View);
		textView.setText("Wilt u stoppen met dit parcour?");
		Button stopja = (Button) stopDialog.findViewById(R.id.parcourdialogja);
		stopja.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				getResultaatDialog();
				stopDialog.cancel();
			}
		});
		Button stopnee = (Button) stopDialog.findViewById(R.id.parcourdialognee);
		stopnee.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				stopDialog.cancel();
			}
		});
	}
	
	private void getResultaatDialog() {
		final Dialog stopDialog = new Dialog(ParcourMap.this);
		stopDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		stopDialog.setContentView(R.layout.parcourdialog);
		stopDialog.setCancelable(false);
		stopDialog.show();
		TextView textView = (TextView) stopDialog.findViewById(R.id.text1View);
		textView.setText("Wilt u de resultaten van het parcour inzien?");
		Button stopja = (Button) stopDialog.findViewById(R.id.parcourdialogja);
		stopja.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Intent intent = new Intent(ParcourMap.this, Resultaten.class);
				startActivity(intent);
			}
		});
		Button stopnee = (Button) stopDialog.findViewById(R.id.parcourdialognee);
		stopnee.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				Intent intent = new Intent(ParcourMap.this, Hoofdmenu.class);
				startActivity(intent);
			}
		});
	}

	/*
	 * private void mapErrorWIndow(String errormessage) { LinearLayout myLayout
	 * = (LinearLayout) findViewById(R.id.maperror); View maperrorview =
	 * getLayoutInflater().inflate(R.layout.mapalert, myLayout, false);
	 * myLayout.removeAllViewsInLayout(); myLayout.addView(maperrorview); }
	 */
	private void listGPSItems() {
		parcourPunten = dbHelper.getParcourpunten(parcourId);
		Log.d("HELP", "amount parcourpunten= " + parcourPunten.size());
		String date = new Date().toGMTString();
		dbHelper.addLoopsessie(parcourId, date);
		
//		dbHelper.addLoopsessiePunten(10, "00:00:05", 0);
//		dbHelper.addLoopsessiePunten(30, "00:01:05", 0);
//		dbHelper.addLoopsessiePunten(60, "00:02:05", 0);
//		dbHelper.addLoopsessiePunten(100, "00:10:50", 0);
//		dbHelper.addLoopsessiePunten(130, "00:12:05", 0);
//		dbHelper.addLoopsessiePunten(180, "00:15:05", 0);
		/*
		 * //Rotterdam Loopsessiepunt nieuwpunt = new Loopsessiepunt();
		 * nieuwpunt.setId(1); nieuwpunt.setLatitude(51.907279885767515);
		 * nieuwpunt.setLongitude(4.460256099700928);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(2);
		 * nieuwpunt.setLatitude(51.90817343352416);
		 * nieuwpunt.setLongitude(4.45908665657043501);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(3);
		 * nieuwpunt.setLatitude(51.90906698128081);
		 * nieuwpunt.setLongitude(4.45791721343994101);
		 * loopsessiepunten.add(nieuwpunt);
		 */
		/*
		 * Loopsessiepunt nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(1);
		 * nieuwpunt.setLatitude(51.907279885767515);
		 * nieuwpunt.setLongitude(4.460256099700928);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(2);
		 * nieuwpunt.setLatitude(51.90698864864919);
		 * nieuwpunt.setLongitude(4.459354877471924);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(3);
		 * nieuwpunt.setLatitude(51.90747845544727);
		 * nieuwpunt.setLongitude(4.459011554718018);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(4);
		 * nieuwpunt.setLatitude(51.90784911650056);
		 * nieuwpunt.setLongitude(4.45871114730835);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(5);
		 * nieuwpunt.setLatitude(51.908285963100546);
		 * nieuwpunt.setLongitude(4.45845365524292);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(6);
		 * nieuwpunt.setLatitude(51.90866985508979);
		 * nieuwpunt.setLongitude(4.458217620849609);
		 * loopsessiepunten.add(nieuwpunt);
		 * 
		 * nieuwpunt = new Loopsessiepunt(); nieuwpunt.setId(7);
		 * nieuwpunt.setLatitude(51.90906698128081);
		 * nieuwpunt.setLongitude(4.457917213439941);
		 * loopsessiepunten.add(nieuwpunt);
		 */
	}

	private class GPSListener implements GpsStatus.Listener {
		public void onGpsStatusChanged(int event) {
			// Toast.makeText(getApplicationContext(),
			// "GPSListener implements GpsStatus.listener",
			// Toast.LENGTH_LONG).show();
			Log.i("MyGps", "Event");

			switch (event) {
			case GpsStatus.GPS_EVENT_STARTED:
				Log.i("MyGps", "Gestart");
				// Toast.makeText(getApplicationContext(),
				// "GPSListener implements: Gestart",
				// Toast.LENGTH_SHORT).show();
				maperror.hideMapError();
				break;
			case GpsStatus.GPS_EVENT_STOPPED:
				Log.i("MyGps", "Gestopt");
				// Toast.makeText(getApplicationContext(),"GPSListener implements: Gestopt",
				// Toast.LENGTH_SHORT).show();
				maperror.showMapError();
				maperror.setText("Er is geen verbinding met de GPS-satelliet.");
				break;
			}
		}
	}

	@SuppressWarnings("rawtypes")
	public void navigateTo(Class c) {
		Intent intent = new Intent(ParcourMap.this, c);
		startActivity(intent);
	}

	/*
	 * @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater
	 * inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return
	 * true; }
	 * 
	 * @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle
	 * item selection switch (item.getItemId()) { case R.id.settings:
	 * navigateTo(Settings.class); return true; case R.id.gpslist:
	 * navigateTo(GpsList.class); return true; default: return
	 * super.onOptionsItemSelected(item); } }
	 */
	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}

	@Override
	protected void onDestroy() {
		dbHelper.close();
		super.onDestroy();
	}
	
	private void berekenSnelheid(){
		String afgelegdeafstand= mapsafgelegdeafstand.getText().toString();
		String[] afsplit = afgelegdeafstand.split("/");
		double afstand= Double.parseDouble(afsplit[0]);
		String tijd= mapsverstrekentijd.getText().toString();
		String[] split = tijd.split(":");
		double hour= Double.parseDouble(split[0]);
		double min= Double.parseDouble(split[1]);
		double sec= Double.parseDouble(split[2]) + (hour*3600) + (min*60);
		int snelheid = (int) (afstand/sec*3.6);
		mapshuidigesnelheid.setText(snelheid+" km/h");
		System.out.println("snelheid = "+snelheid);
	}

	private void dichtBijPunt(double[] gLocatie) {
		int punt = 0;
		double dichtBijPunt = 30;
		for (int i = 0; i < parcourPunten.size(); i++) {
			double gebruikerAfstand = OpRoute.getPuntenAfstand(gLocatie,
					parcourPunten.get(i));
			if (gebruikerAfstand < dichtBijPunt) {
				dichtBijPunt = gebruikerAfstand;
				punt = i;
			}
		}
		if (dichtBijPunt > 29) {
			maperror.showMapError();
			maperror.setText("You are to far away, try to get closer.");
//			setTextToSpeak("You are to far away", "try to get closer.");
		}
		beginpuntId = punt;
		OpRoute.i = punt;
	}

	/* Class My Location Listener */

	public class MyLocationListener implements LocationListener {

		public void onLocationChanged(Location loc) {
			// If location is not null do the following
			if (loc != null) {
				if (!pauzestatus) {
					dbHelper.open();
					// Toast.makeText(getApplicationContext(), "lo aan = " +
					// loc.getLongitude() + " la aan= "+ loc.getLatitude(),
					// Toast.LENGTH_LONG).show();
					Log.d("LOKATIE", "lo = " + loc.getLongitude() + " la= "
							+ loc.getLatitude());
					double mlongti = loc.getLongitude();
					double mlatiti = loc.getLatitude();

					huidigelocatie = new double[2];
					huidigelocatie[0] = mlongti;
					huidigelocatie[1] = mlatiti;

					mapOverlaysList = mapView.getOverlays();

					Drawable userdraw = getApplicationContext().getResources()
							.getDrawable(R.drawable.mapusericon);
					KaartGebruikerLaag itemizedOverlayUser = new KaartGebruikerLaag(
							userdraw, getApplicationContext());
					GeoPoint userpunt = new GeoPoint(
							(int) (huidigelocatie[1] * 1e6),
							(int) (huidigelocatie[0] * 1e6));

					OverlayItem overlayitemuser = new OverlayItem(userpunt,
							"Positie", "ik");

					if (mapsize != (int) mapOverlaysList.size()) {
						mapOverlaysList.remove(mapOverlaysList.size() - 1);
					}

					// Toast.makeText(getApplicationContext(),
					// "new user location", Toast.LENGTH_SHORT).show();

					itemizedOverlayUser.addOverlay(overlayitemuser);

					mapOverlaysList.add(itemizedOverlayUser);

					if (OpRoute.i == -1) {
						dichtBijPunt(huidigelocatie);
						// Toast.makeText(getApplicationContext(),"The closest point to you is point "
						// + OpRoute.i,Toast.LENGTH_LONG).show();
					}
					// dbHelper.addParcourPunten(parcourId, mlongti,mlatiti);

					// Als de gebruiker binnen de maximale afstand is van het
					// punt
					// ga dan in de if en anders in de else
					if (OpRoute.isOpRoute(huidigelocatie,
							parcourPunten.get(OpRoute.i))) {
						Log.d("LOCATIE", "je loopt binnen de route i= "
								+ OpRoute.i);
						// Toast.makeText(getApplicationContext(),
						// "You are walking inside the route i= " + OpRoute.i,
						// Toast.LENGTH_LONG).show();
						int afstand = (int) OpRoute.getPuntenAfstand(
								huidigelocatie, parcourPunten.get(beginpuntId));
						mapsafgelegdeafstand.setText(afstand + "/"
								+ parcourlengte + " m");
						snelheidZeggen();
					} else {
						// Als de loopsessie punten niet het laaste punt is
						if (OpRoute.i < parcourPunten.size()) {
							// Bij de if kijk je of de gebruiker binnen de
							// afstand
							// van het virtuele punt is.
							if (OpRoute.isOpRoute(huidigelocatie,
									OpRoute.getInterpunten(parcourPunten))) {
								Log.d("LOCATIE",
										"Binnen route met een virtueel punt laatste punt= "
												+ OpRoute.i);
								int afstand = (int) OpRoute.getPuntenAfstand(
										huidigelocatie,
										parcourPunten.get(beginpuntId));
								mapsafgelegdeafstand.setText(afstand + "/"
										+ parcourlengte + " m");
								// Toast.makeText(getApplicationContext(),"You are walking inside the route with the virtual point after the point= "+
								// OpRoute.i, Toast.LENGTH_LONG).show();
								snelheidZeggen();
							} else {
								// Als de gebruiker niet meer bij het oude punt
								// is
								// en niet in de buurt van het virtuele punt,
								// kijk
								// dan of de gebruiker
								// al bij het volgende punt is. Door i op te
								// hogen
								// kijk je naar het volgende punt als hij
								// inderdaad
								// bij het volgende
								// punt is dan ga je in de komende if anders in
								// de
								// else
								OpRoute.i++;
								if (OpRoute.isOpRoute(huidigelocatie,
										parcourPunten.get(OpRoute.i))) {
									Log.d("LOCATIE",
											"JE LOOPT binnen DE route met punt= "
													+ OpRoute.i);
									int afstand = (int) OpRoute
											.getPuntenAfstand(huidigelocatie,
													parcourPunten
															.get(beginpuntId));
									mapsafgelegdeafstand.setText(afstand + "/"
											+ parcourlengte + " m");
									snelheidZeggen();
								} else {
									// De gebruiker is bij geen van de punten
									// zet
									// i(het punt) weer op het punt waar de
									// gebruiker als laatst is gezien en vermeld
									// tegen de gebruiker dat hij buiten de
									// route is
									// gaan lopen.
									OpRoute.i--;
									// Toast.makeText(
									// getApplicationContext(),
									// "JE LOOPT BUITEN DE LOKATIE i--= "
									// + OpRoute.i, Toast.LENGTH_LONG)
									// .show();
									setTextToSpeak("You are to far away",
											"try to get closer.");
								}
							}
						} else {
							// Toast.makeText(
							// getApplicationContext(),
							// "JE LOOPT BUITEN DE LOKATIE laatste punt i= "
							// + OpRoute.i, Toast.LENGTH_LONG).show();
							setTextToSpeak("You are to far away",
									"try to get closer.");
							Log.d("LOCATIE", "JE LOOPT BUITEN DE LOKATIE");
						}
					}

				dbHelper.addLoopsessiePunten((int) OpRoute.getPuntenAfstand(huidigelocatie, parcourPunten.get(beginpuntId)), mapsverstrekentijd.getText().toString(), loopsessieId);
				berekenSnelheid();
				
				GeoPoint userLoc = new GeoPoint((int) (mlatiti * 1E6),
						(int) (mlongti * 1E6));
				mapController.animateTo(userLoc);
				}
			} else {
				// Toast.makeText(getApplicationContext(), "locatie is null",
				// Toast.LENGTH_LONG).show();
			}
		}
		
		private void snelheidZeggen(){
		if(!parcourkeuzegemsnelheid.equals("0")){
			int maxSnelheid = Integer.parseInt(parcourkeuzegemsnelheid);
			String speed = mapshuidigesnelheid.getText().toString();
			String[] a = speed.split(" km");
			int huidigeSnelheid = Integer.parseInt(a[0]);
			if(huidigeSnelheid>maxSnelheid+3){
				setTextToSpeak("You are walking to fast","try to slow down.");
			} else if(huidigeSnelheid<maxSnelheid-3){
				setTextToSpeak("You are walking to slow","try to run faster.");
			}
		}
	}

		public void onProviderDisabled(String provider) {
			//
			// Toast.makeText(getApplicationContext(), "Gps Disabled",
			// Toast.LENGTH_SHORT).show();

		}

		public void onProviderEnabled(String provider) {
			//
			// Toast.makeText(getApplicationContext(), "Gps Enabled",
			// Toast.LENGTH_SHORT).show();

		}

		public void onStatusChanged(String provider, int status, Bundle extras) {

		}

	}/* End of Class MyLocationListener */

	public String getUrl(GeoPoint src, GeoPoint dest) {
		// Toast.makeText(getApplicationContext(),
		// "public String getUrl(GeoPoint src, GeoPoint dest)",
		// Toast.LENGTH_LONG).show();
		StringBuilder urlString = new StringBuilder();

		urlString.append("http://maps.google.com/maps?f=d&hl=en");
		urlString.append("&saddr=");
		urlString.append(Double.toString((double) src.getLatitudeE6() / 1.0E6));
		urlString.append(",");
		urlString
				.append(Double.toString((double) src.getLongitudeE6() / 1.0E6));
		urlString.append("&daddr=");// to
		urlString
				.append(Double.toString((double) dest.getLatitudeE6() / 1.0E6));
		urlString.append(",");
		urlString
				.append(Double.toString((double) dest.getLongitudeE6() / 1.0E6));
		urlString.append("&ie=UTF8&0&om=0&output=kml");

		return urlString.toString();
	}

	@Override
	protected void onPause() {
		super.onPause();
		wl.release();
	}

	public class MapOverlayLines extends com.google.android.maps.Overlay {

		private GeoPoint mGpt1;
		private GeoPoint mGpt2;

		protected MapOverlayLines(GeoPoint gp1, GeoPoint gp2) {
			mGpt1 = gp1;
			mGpt2 = gp2;
		}

		@Override
		public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
				long when) {
			super.draw(canvas, mapView, false);
			Paint paint;
			paint = new Paint();
			paint.setColor(Color.RED);
			paint.setAntiAlias(true);
			paint.setStyle(Style.STROKE);
			paint.setStrokeWidth(2);
			Point pt1 = new Point();
			Point pt2 = new Point();
			projection = mapView.getProjection();
			projection.toPixels(mGpt1, pt1);
			projection.toPixels(mGpt2, pt2);
			canvas.drawLine(pt1.x, pt1.y, pt2.x, pt2.y, paint);
			return true;
		}
	}

	public void onInit(int arg0) {
		speak();
	}

	public void setTextToSpeak(String text1, String text2) {
		myText1 = text1;
		myText2 = text2;
		Intent checkIntent = new Intent();
		checkIntent.putExtra("engine",
				TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
		checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
		Log.d("Hlkhjdsajlk",
				"setText2 hij komt hier " + checkIntent.getAction());
		startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == MY_DATA_CHECK_CODE) {
			if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
				// success, create the TTS instance
				mTts = new TextToSpeech(this, this);
			} else {
				// missing data, install it
				Intent installIntent = new Intent();
				installIntent
						.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
				startActivity(installIntent);
			}
		}
	}

	public void speak() {
		mTts.setLanguage(Locale.US);
		mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
		mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
	}

	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
			String key) {
		// TODO Auto-generated method stub
	}
}